今天來點輕鬆的,我們要做的是,當nav bar滾動到頁面頂端的時候固定
const nav = document.querySelector('#main');
const topOfNav = nav.offsetTop;
function fixNav() {
console.log(topOfNav, window.scrollY);
}
window.addEventListener('scroll', fixNav);
第一步一樣是先選定元素,然後讀取offsetTop
屬性,這樣就得到nav bar到頁面頂端的距離了
另外,我們還需要頁面捲動的距離,使用之前講過的window.scrollY
即可
下圖為兩者的數值
接下來,用這兩項數值比較,來判斷nav bar是否已經到達頂部了
function fixNav() {
if (window.scrollY >= topOfNav) {
document.body.classList.add('fixed-nav');
} else {
document.body.classList.remove('fixed-nav');
}
}
如果到了就加上一個fixed-nav class
.fixed-nav nav {
position: fixed;
box-shadow: 0 5px 0 rgba(0, 0, 0, 0.1);
}
⬆︎未達頂端
⬇︎已達頂端
function fixNav() {
if (window.scrollY >= topOfNav) {
document.body.style.paddingTop = nav.offsetHeight + 'px';
document.body.classList.add('fixed-nav');
} else {
document.body.style.paddingTop = 0;
document.body.classList.remove('fixed-nav');
}
}
當css的position
為fixed
的時候,元素會被移出DOM,固定的元素會像是浮在視窗上,這個時候,原本的DOM也會減去這段空間,所以我們需要把這段空間補起來,不然每當nav bar被固定的時候,body
都會向上跳一段距離,這邊用offsetHeight
屬性動態取得元素的高度
.fixed-nav li.logo {
max-width: 500px;
}
.fixed-nav .site-wrap {
transform: scale(1);
}
最後,這邊要在nav bar固定的時候加上一個logo
這邊只要把logo的max-width
設為大於0的數值就好了,因爲logo本來就存在,只是max-width
的數值是0
li.logo {
max-width: 0;
overflow: hidden;
background: white;
transition: all .5s;
font-weight: 600;
font-size: 30px;
}